home *** CD-ROM | disk | FTP | other *** search
/ Business Shareware / Business Shareware.iso / start / disk / tcpy200 / tc115.asm < prev    next >
Assembly Source File  |  1992-10-17  |  43KB  |  2,610 lines

  1. CSEG SEGMENT
  2.  ASSUME CS:CSEG
  3.  ORG 100H
  4. START:JMP BEGIN
  5.  
  6. ;EXPENDABLE DATA AFTER STARTUP
  7. TYPEMSG    DB 13,10,"TurboCopy V1.15.",13,10
  8.            DB "by "
  9. ID         DB "Pierre J. le Riche 1991-92.",13,10
  10.            DB "Distribute freely and use as often as desired,",13,10,"but no modifications please.",13,10,13,10,"$"
  11. PRM        DB "Invalid number of parameters,$"
  12. BADSDRMSG  DB 13,10,"Invalid drive specification in source path,$"
  13. BSRCE&WRK  DB "Bad or missing source path,"
  14. FHMSG      DB " type TC /? for help.",13,10,"$"
  15. MSG2       DB "TurboCopy requires 128K ram.",13,10,"$"
  16. MSG3       DB "Total available memory is $"
  17. MSG4       DB " bytes.",13,10,"$"
  18. HELPMSG    DB "TC source [dest.] [/A] [/C] [/O] [/D:date] [/H] [/E] [/M] [/P] [/S] [/V] [/W]",13,10
  19.            DB "  source       Specifies the file(s) to copy.",13,10
  20.            DB "  destination  Specifies the location and/or name of new files.",13,10
  21.            DB "  /A           Copy only files with the archive attribute set.",13,10
  22.            DB "  /C           Do not create subdirectories on the destination drive.",13,10
  23.            DB "  /O           Overwrite all existing files on the destination drive.",13,10
  24.            DB "  /D:MM-DD-YY  Copy files changed on or after the specified date.",13,10
  25.            DB "  /E           Append to end of file if it exists. /O has preference.",13,10
  26.            DB "  /H           Include hidden files and system files in copy.",13,10
  27.            DB "  /M           Same as /A, but resets archive attribute. Overrides /A.",13,10
  28.            DB "  /P           Prompt for confirmation before copying each directory.",13,10
  29.            DB "  /S           Include all source subdirectories in copy.",13,10
  30.            DB "  /V           Verify all new files on the destination drive.",13,10
  31.            DB "  /W           Wait for a keypress before commencing operation.",13,10
  32.            DB "If you find this program useful, and use it often, a",9,9,   "P.O. Box 209",13,10
  33.            DB "contribution will be much appreciated. Any advice and",9,9,  "Kuils River",13,10
  34.            DB "suggestions for further versions will also be welcome.",9,9, "7580",13,10
  35.            DB "Write to the address on the right.",9,9,9,9,                 "South Africa$"
  36. PROTECT    DW "P"*10,"i"*20,"e"*30,"r"*40,"r"*50,"e"*60
  37. BADDDRMSG  DB 13,10,"Invalid drive specification in destination path,$"
  38. FILDIR     DB "' a directory or a filename?",13,10
  39.            DB "Please select <F>ile, or <D>irectory: $"
  40. WAITMSG    DB "Please press any key to start operation.",13,10,"$"
  41.  
  42.  
  43.  
  44.  
  45. ;INEXPENDABLE DATA
  46. SHELL       DB  "C:\COMMAND.COM",51 DUP (0)
  47. COMSPEC     DB  "OMSPEC="
  48. SHPARM      DB  14 DUP (0)
  49. PARM        DB  0
  50. ERRLOAD     DB  13,10," Error loading command interpreter...","$"
  51. RECERR      DB  13,10,"Unable to reclaim memory. Exiting Turbocopy.",13,10,"$"
  52. FLOPSIZ12  DW 0
  53. FLOPSIZ36  DW 0
  54. YESNO      DB 0
  55. FILYET     DW 0
  56. RESERVE    DB 0 ;0=DO NOT RESERVE SPACE FOR DIRECTORIES
  57. DISKS      DW 1
  58. NOCREATE   DB 0
  59. COPDIRS    DB 0
  60. ARCHIVE    DB 0
  61. ATTRCOPY   DW 0
  62. APPEND     DB 0
  63. PROMPT     DB 0
  64. OVERWRITE  DB 0
  65. ALLFIL     DB 0
  66. VERSET     DB 0
  67. STCOPY1    DB 13,10,13,10," Still to copy  file, totalling  bytes.$"
  68. OVERMSG    DB 13,10,13,10,"  File exists. Select <O>verwrite, overwrite <A>ll, <S>kip or App<e>nd: $"
  69. NEWDMSG    DB 13,10," Please insert destination disk $"
  70. NEWDMSG1   DB " in drive "
  71. NEWDMSG2   DB "A:, or press <S> to shell to DOS.",13,10,"$"
  72. DISKFULL   DB 13,10,13,10," Non-removable disk in drive "
  73. DISKFULL2  DB "@: is full.",13,10,"$"
  74. PROCEED    DB 0
  75. DISKLESS   DB " Insufficient space available on non-removable disk in drive "
  76. DISKLESS2  DB "@:",13,10," Please select <P>roceed, or <A>bort: $"
  77. PROMPTMSG  DB " Copy directory? Please press Y=yes, or N=no: $"
  78. ROPEN      DB 0 ;0=FIRST FILE NOT OPEN, 1=FIRST FILE ALREADY OPEN
  79. FIL2COPY   DW 0
  80. STCK       DW 50 DUP (0)
  81.            TOP EQU THIS WORD
  82. ARCERR     DB 13,10,13,10,"  Error changing source file attribute.",13,10,"$"
  83. ERRRFIL    DB 13,10,13,10,"  Error reading file.",13,10,"$"
  84. ERRWFIL    DB 13,10,13,10,"  Error writing file.",13,10,"$"
  85. FSIZ       DD 0 ;READ FILE SIZE
  86. RHANDLE    DW 0 ;FILE HANDLE FOR READING
  87. WHANDLE    DW 0
  88. READMSG    DB 13,10,"  Reading: $"
  89. WRITEMSG   DB 13,10,"  Writing: $"
  90. NFTC       DB " Not enough free space on destination drive to hold any more files.$"
  91. CRDIR      DB " Creating directory on destination drive.",13,10,"$"
  92. BADCDIR    DB " Error creating directory on destination drive.",13,10,"$"
  93. EMPDIR     DB " No matching files found.",13,10,"$"
  94. SAMEMSG    DB " Source and destination paths identical.",13,10,"$"
  95. BADSPATH   DB " Invalid source path.",13,10,"$"
  96. BADDEST2   DB " Error accessing destination drive.",13,10,"$"
  97. FILBYT     DB " bytes in "
  98. FILNUM     DB " source files"
  99. SUBDNUM    DB " subdirectories"
  100. DAVAIL     DB " bytes available on destination drive.",13,10,"$"
  101. FILES      DW 0
  102. SUBDIRS    DW 0
  103. PARMOFF    DW 0
  104. MEM        DW 0 ;NUMBER OF PARAGRAPHS ALLOCATED TO PROGRAM
  105. NEXTPATH   DW OFFSET PROGEND
  106. CURPATH    DW OFFSET PROGEND
  107. CURDEST    DW 0
  108. CPMSG      DB 13,10,13,10,"Copy $"
  109. PRIORITY   DB 1
  110. RENFILE    DB "        .   "
  111. ALLOC      DW 0 ;SIZE OF A ALLOCATION UNIT ON DESTINATION DRIVE IN BYTES
  112. FREEALC    DW 0 ;NUMBER OF FREE SECTORS ON DESTINATION DRIVE
  113. READPARA   DW 0 ;CURRENT OFFSET FROM CS IN PARAGRAPHS
  114. WRITEPARA  DW 0
  115. BEGINPARA  DW 0 ;BEGIN OFFSET OF READING OPERATION
  116. TOTBYTES   DD 0
  117. TOTFILES   DD 0
  118. WSIZ       DD 0
  119. NOFCOPY    DB 13,10,"No files copied.",13,10,"$"
  120. TOTMSG     DB 13,10,13,10,"Copied a total of  bytes in  files.",13,10,"Program was active for "
  121. ENDMES2    DB " hours"
  122. ENDMES3    DB " minutes"
  123. ENDMES4    DB " and "
  124. ENDMES5    DB " seconds"
  125. BTIMEDX    DW 0
  126. BTIMECX    DW 0
  127. ENDMES     DB 13,10,"Thank you for using TurboCopy!",13,10,36
  128. FREAD      DW 0
  129. DATEFILE   DB "File dates must be the same or later than $"
  130. DATE       DB 0
  131.  
  132. YEAR    DW 1980
  133. MONTH   DW 1
  134. DAY     DW 1
  135. DATELEN    DW 0
  136. NUMLEN  DW 0
  137. YFLAG    DB 0
  138. WRKYEAR DW 0
  139. WORKSI    DW 0
  140. WRKMON    DW 0
  141.  
  142. ;*************************************************************
  143. ;*INTELLIDATE:CONVERTS OBSCURE DATES INTO YEAR,MONTH,DAY     *
  144. ;*ENTRY: DS:BP POINTS TO ASCIIZ STRING THAT CONTAINS DATE;   *
  145. ;*     DEFAULTS IN YEAR, MONTH AND DAY             *
  146. ;*RETURN:DATE IN YEAR, MONTH AND DAY                         *
  147. ;*       REGISTERS, UNALTERED                                *
  148. ;*************************************************************
  149. INTELLIDATE:PUSH AX BX CX DX SI DI BP DS ES
  150.  MOV WRKYEAR,0
  151.  MOV WRKMON,0
  152.  MOV NUMLEN,0
  153.  PUSH CS
  154.  POP ES
  155.  MOV DI,OFFSET TYPEMSG
  156.  MOV SI,BP
  157.  XOR CX,CX
  158. COPYDATE:MOVSB
  159.  CMP ES:[DI-1],BYTE PTR 0
  160.  JE ENDCOPY
  161.  CMP ES:[DI-1],BYTE PTR "0"
  162.  JB NNCOPY
  163.  CMP ES:[DI-1],BYTE PTR "9"
  164.  JA NNCOPY
  165.  INC NUMLEN
  166. NNCOPY:INC CX
  167.  JMP COPYDATE
  168. ENDCOPY:PUSH CS
  169.  POP DS
  170.  MOV DATELEN,CX
  171.  MOV CX,4    ;FIND THE YEAR FIRST
  172.  CALL FINDLAST
  173.  CMP AX,1980
  174.  JB YEAR2
  175.  CMP AX,2000
  176.  JNA YEAR1OK
  177.  CMP AX,2099
  178.  JA YEAR2
  179.  MOV WRKYEAR,AX
  180.  MOV WORKSI,SI
  181.  MOV YFLAG,255
  182.  CMP AX,2013
  183.  JB YEAR2
  184. YEAR1OK:MOV YEAR,AX
  185.  MOV AL,"X"
  186.  MOV DI,SI
  187.  REP STOSB
  188.  CALL MONTHL;JUMP TO ROUTINE THAT CHECKS LEFT HAND SIDE FIRST FOR MONTH
  189.  JMP DODAY
  190. YEAR2:MOV CX,4
  191.  CALL FINDFIRST
  192.  CMP AX,1980
  193.  JB YEAR3
  194.  CMP AX,2000
  195.  JNA YEAR2OK
  196.  CMP AX,2099
  197.  JA YEAR3
  198.  MOV WRKYEAR,AX
  199.  MOV WORKSI,SI
  200.  MOV YFLAG,0
  201.  CMP AX,2013
  202.  JB YEAR3
  203. YEAR2OK:MOV YEAR,AX
  204.  CALL PATCH
  205.  CALL MONTHR;JUMP TO ROUTINE THAT CHECKS RIGHT HAND SIDE FIRST FOR MONTH
  206.  JMP DODAY
  207. YEAR3:MOV CX,2
  208.  CALL FINDLAST
  209.  CMP AX,80
  210.  JB YEAR4
  211.  ADD AX,1900
  212.  MOV YEAR,AX
  213.  CALL PATCH
  214.  CALL MONTHL
  215.  JMP DODAY
  216. YEAR4:MOV CX,2
  217.  CALL FINDFIRST
  218.  CMP AX,80
  219.  JB YEAR5
  220.  ADD AX,1900
  221.  MOV YEAR,AX
  222.  CALL PATCH
  223.  CALL MONTHR
  224.  JMP DODAY
  225. YEAR5:CMP NUMLEN,5
  226.  JB DOMONTH
  227.  CMP WRKYEAR,0
  228.  JE DOMONTH
  229.  MOV CX,4
  230.  MOV SI,WORKSI
  231.  CALL PATCH
  232.  MOV AX,WRKYEAR
  233.  MOV YEAR,AX
  234.  CMP YFLAG,255
  235.  JNE YFNIL
  236.  CALL MONTHL
  237.  JMP DODAY
  238. YFNIL:CALL MONTHR
  239.  JMP DODAY
  240. DOMONTH:CALL MONTHL
  241.  CMP WRKMON,0
  242.  JNE MONOK
  243.  CALL MONTHR
  244. MONOK:JMP DODAY
  245. MONTHR:MOV CX,2
  246.  CALL FINDLAST
  247.  OR AX,AX
  248.  JNZ MNZ
  249.  RET
  250. MNZ:CMP AX,12
  251.  JA BADMON
  252.  MOV WRKMON,AX
  253.  CALL PATCH
  254.  RET
  255. BADMON:CMP NUMLEN,3
  256.  JNA ONEDMON
  257.  RET
  258. ONEDMON:MOV BL,10
  259.  DIV BL
  260.  XCHG AL,AH
  261.  XOR AH,AH
  262.  MOV WRKMON,AX
  263.  INC SI
  264.  DEC CX
  265.  CALL PATCH
  266.  RET
  267. MONTHL:MOV CX,2
  268.  CALL FINDFIRST
  269.  OR AX,AX
  270.  JNZ MONLOK
  271.  RET
  272. MONLOK:CMP AX,12
  273.  JA MONLBAD
  274.  MOV WRKMON,AX
  275.  CALL PATCH
  276.  RET
  277. MONLBAD:MOV BL,10
  278.  DIV BL
  279.  XOR AH,AH
  280.  MOV WRKMON,AX
  281.  DEC CX
  282.  CALL PATCH
  283.  RET
  284. DODAY:CMP WRKMON,0
  285.  JE MONDEF
  286.  MOV AX,WRKMON
  287.  MOV MONTH,AX
  288. MONDEF:MOV CX,2
  289.  CALL FINDFIRST
  290.  OR AX,AX
  291.  JZ DAYEND
  292.  CMP AX,31
  293.  JNA DAYOK
  294.  MOV BL,10
  295.  DIV BL
  296.  XOR AH,AH
  297.  OR AX,AX
  298.  JZ DAYEND
  299. DAYOK:MOV DAY,AX
  300.  CALL PATCH
  301. DAYEND:
  302. INTELLLIEND:POP ES DS BP DI SI DX CX BX AX
  303.  RET
  304.  
  305. ;FINDFIRST:SCANS FROM LEFT OF DATE UNTIL IT FINDS THE BEGINNING OF A NUMERIC
  306. ;       STRING. IT THEN CONVERTS THIS STRING INTO A NUMBER IN AX. THE
  307. ;       MAXIMUM LENGTH OF THE STRING MUST BE IN CX (IN CASE OF LONG NUMBERS)
  308. ;RETURN:SI POINTS TO BEGINNING OF NUMBER, CX ACTUAL LENGTH, NUMBER IN AX
  309. ;    AX=65535 IF NO NUMBERS FOUND (SI=END+1, CX=UNCHANGED)
  310. FINDFIRST:PUSH BX DX BP
  311.  MOV SI,OFFSET TYPEMSG
  312. SCANRIGHT:LODSB
  313.  CMP AL,"0"
  314.  JB SRNOTNUM
  315.  CMP AL,"9"
  316.  JA SRNOTNUM
  317.  JMP FOUNDNUM
  318. SRNOTNUM:OR AL,AL
  319.  JNZ SRNOTNUM2
  320.  XOR AX,AX
  321.  XOR CX,CX
  322.  POP BP DX BX
  323.  RET
  324. SRNOTNUM2:JMP SCANRIGHT
  325. FOUNDNUM:XOR DX,DX
  326.  DEC SI
  327.  PUSH SI
  328. FSRLENGTH:LODSB
  329.  CMP AL,"0"
  330.  JB ENDDLEN
  331.  CMP AL,"9"
  332.  JA ENDDLEN
  333.  INC DX
  334.  LOOP FSRLENGTH
  335.  INC SI
  336. ENDDLEN:DEC SI
  337.  DEC SI
  338.  MOV CX,DX
  339.  PUSH CX
  340.  MOV BX,1
  341.  XOR BP,BP
  342. GETNUM:STD
  343.  LODSB
  344.  CLD
  345.  XOR AH,AH
  346.  SUB AL,"0"
  347.  MUL BX
  348.  ADD BP,AX
  349.  MOV AL,10
  350.  XOR AH,AH
  351.  MUL BX
  352.  MOV BX,AX
  353.  LOOP GETNUM
  354.  MOV AX,BP
  355.  POP CX SI BP DX BX
  356.  RET
  357.  
  358. ;FINDLAST: SCANS FROM RIGHT OF DATE UNTIL IT FINDS THE BEGINNING OF A NUMERIC
  359. ;       STRING. IT THEN CONVERTS THIS STRING INTO A NUMBER IN AX. THE
  360. ;       MAXIMUM LENGTH OF THE STRING MUST BE IN CX (IN CASE OF LONG NUMBERS)
  361. ;RETURN:SI POINTS TO BEGINNING OF NUMBER, CX ACTUAL LENGTH, NUMBER IN AX
  362. ;    AX=65535 IF NO NUMBERS FOUND (SI=END+1, CX=UNCHANGED)
  363. FINDLAST:STD
  364.  PUSH BX DX BP
  365.  MOV SI,OFFSET TYPEMSG
  366.  ADD SI,DATELEN
  367.  DEC SI
  368. SCANLEFT:LODSB
  369.  CMP AL,"0"
  370.  JB SLNOTNUM
  371.  CMP AL,"9"
  372.  JA SLNOTNUM
  373.  JMP FOUNDNUML
  374. SLNOTNUM:CMP SI,OFFSET TYPEMSG
  375.  JNB SCANLEFT
  376.  XOR AX,AX
  377.  XOR CX,CX
  378.  CLD
  379.  POP BP DX BX
  380.  RET
  381. FOUNDNUML:INC SI
  382.  XOR BP,BP
  383.  MOV BX,1
  384.  PUSH CX
  385. GETNUML:LODSB
  386.  CMP SI,OFFSET TYPEMSG-1
  387.  JB ENDGET
  388.  CMP AL,"0"
  389.  JB ENDGET
  390.  CMP AL,"9"
  391.  JA ENDGET
  392.  XOR AH,AH
  393.  SUB AL,"0"
  394.  MUL BX
  395.  ADD BP,AX
  396.  MOV AL,10
  397.  XOR AH,AH
  398.  MUL BX
  399.  MOV BX,AX
  400.  LOOP GETNUML
  401.  DEC SI
  402. ENDGET:POP DX
  403.  SUB DX,CX
  404.  MOV CX,DX
  405.  INC SI
  406.  INC SI
  407.  MOV AX,BP
  408.  CLD
  409.  POP BP DX BX
  410.  RET
  411.  
  412. ;PATCH: INTERNAL ROUTINE FOR INTELLIDATE
  413. PATCH:MOV AL,"X"
  414.  SUB NUMLEN,CX
  415.  MOV DI,SI
  416.  JCXZ PATCH2
  417.  REP STOSB
  418. PATCH2:RET
  419.  
  420.  
  421.  
  422.  
  423.  
  424. ;BOMB: ROUTINE TO EXIT PROGRAM
  425. BOMB:MOV AL,VERSET
  426.  MOV AH,2EH
  427.  INT 21H
  428.  MOV AX,4CH*256
  429.  INT 21H
  430.  
  431. ;BINTODEC: STORES DX:AX AS ASCII NUMBER AT DS:DI
  432. ;RETURN: DI POINTS TO NEXT CHARACTER
  433. BINTODEC:PUSH AX BX CX DX BP
  434.  XCHG DX,BP
  435.  MOV BX,10
  436.  MOV CX,48
  437. BINTODEC2:MOV DH,CH
  438.  INC DH
  439.  AND DH,3
  440.  JNZ BINTODEC3
  441.  INC CH
  442.  MOV DL,","
  443.  PUSH DX
  444. BINTODEC3:XCHG BP,AX
  445.  XOR DX,DX
  446.  DIV BX
  447.  XCHG BP,AX
  448.  DIV BX
  449.  OR DL,CL
  450.  INC CH
  451.  PUSH DX
  452.  OR BP,BP
  453.  JNZ BINTODEC2
  454.  OR AX,AX
  455.  JNZ BINTODEC2
  456. BINTODEC4:POP DX
  457.  MOV DS:[DI],DL
  458.  INC DI
  459.  DEC CH
  460.  JNZ BINTODEC4
  461.  POP BP DX CX BX AX
  462.  RET
  463.  
  464. BADDDRIVE:;DISPLAY INVALID SOURCE DRIVE MESSAGE
  465.  MOV AH,9
  466.  MOV DX,OFFSET BADDDRMSG
  467.  INT 21H
  468.  MOV DX,OFFSET FHMSG
  469.  INT 21H
  470.  JMP BOMB
  471. BADMEMORY:MOV AH,9
  472.  MOV DX,OFFSET MSG2
  473.  INT 21H
  474.  JMP BOMB
  475. BADSDRIVE:;DISPLAY INVALID SOURCE DRIVE MESSAGE
  476.  MOV AH,9
  477.  MOV DX,OFFSET BADSDRMSG
  478.  INT 21H
  479.  MOV DX,OFFSET FHMSG
  480.  INT 21H
  481.  JMP BOMB
  482. NOPARAM:;DISPLAY NO PARAMETERS MESSAGE
  483.  MOV AH,9
  484.  MOV DX,OFFSET PRM
  485.  INT 21H
  486.  MOV DX,OFFSET FHMSG
  487.  INT 21H
  488.  JMP BOMB
  489. BADSOURCE:;DISPLAY BAD/MISSING SOURCE MESSAGE
  490.  MOV DX,OFFSET BSRCE&WRK
  491.  MOV AH,9
  492.  INT 21H
  493.  JMP BOMB
  494.  
  495. BEGIN:CLI
  496.  MOV SP,OFFSET TOP
  497.  STI
  498.  MOV DX,OFFSET TYPEMSG
  499.  MOV AH,9
  500.  INT 21H
  501.  MOV AH,4AH
  502.  PUSH AX
  503.  MOV BX,65535
  504.  INT 21H
  505.  POP AX
  506.  INT 21H
  507.  JC BADMEMORY
  508.  CMP BX,128*64
  509.  JB BADMEMORY
  510.  MOV AH,9
  511.  MOV DX,OFFSET MSG3
  512.  INT 21H
  513.  MOV DI,DX
  514.  PUSH DX
  515.  MOV AX,BX
  516.  MOV CX,16
  517.  MUL CX
  518.  CALL BINTODEC
  519.  POP DX
  520.  MOV AL,"$"
  521.  STOSB
  522.  MOV AH,9
  523.  INT 21H
  524.  MOV DX,OFFSET MSG4
  525.  INT 21H
  526.  MOV MEM,BX
  527.  MOV SI,80H
  528.  PUSH SI SI
  529.  POP DI
  530.  MOV CX,128
  531. MAKECAPS:LODSB
  532.  CMP AL,"a"
  533.  JB NOTSMALL
  534.  CMP AL,"z"
  535.  JA NOTSMALL
  536.  SUB AL,32
  537. NOTSMALL:STOSB
  538.  LOOP MAKECAPS
  539.  POP SI
  540.  LODSB
  541.  MOV CL,AL
  542.  XOR CH,CH
  543.  OR CX,CX
  544.  JNZ NOPARAMNO
  545.  JMP NOPARAM
  546. NOPARAMNO:MOV BX,CX
  547.  MOV DS:[SI+BX],BYTE PTR 0
  548.  PUSH SI CX
  549.  MOV AH,2CH
  550.  INT 21H
  551.  MOV BTIMEDX,DX ;SAVE BEGIN TIME
  552.  MOV BTIMECX,CX
  553.  MOV SI,OFFSET PROTECT
  554.  MOV DI,OFFSET ID-1
  555.  MOV CX,5
  556.  MOV BL,10
  557. PROT1:LODSW
  558.  INC DI
  559.  DIV BL
  560.  ADD BL,10
  561.  CMP AL,ES:[DI]
  562.  JNE BADBOY
  563.  LOOP PROT1
  564.  JMP GOODBOY
  565. BADBOY:JMP SHORT BADBOY
  566.  
  567. GOODBOY:POP CX SI
  568.  PUSH SI CX
  569.  ;SCAN THE PARAMETERS AND UPDATE ALL FLAGS
  570. SCPARMS:LODSB
  571.  OR AL,AL
  572.  JNZ AGNO1
  573.  JMP ENDSCPARMS
  574. AGNO1:CMP AL,"/"
  575.  JNE SCPARMS
  576.  MOV AL,DS:[SI]
  577.  CMP AL,"O"
  578.  JNE NOTOVERWRITE
  579.  MOV OVERWRITE,1
  580. NOTOVERWRITE:CMP AL,"P"
  581.  JNE NOTPROMPT
  582.  MOV PROMPT,1
  583. NOTPROMPT:CMP AL,"S"
  584.  JNE NOCOPDIRS
  585.  MOV COPDIRS,1
  586. NOCOPDIRS:CMP AL,"C"
  587.  JNE NONOCREATE
  588.  MOV NOCREATE,1
  589. NONOCREATE:CMP AL,"A"
  590.  JNE NOARC1
  591.  MOV ARCHIVE,2
  592. NOARC1:CMP AL,"M"
  593.  JNE NOARCHIVE
  594.  MOV ARCHIVE,1
  595. NOARCHIVE:CMP AL,"V"
  596.  JNE NOVERIFY
  597.  MOV AH,54H
  598.  INT 21H
  599.  MOV VERSET,AL
  600.  MOV AX,1+2EH*256
  601.  XOR DL,DL
  602.  INT 21H
  603.  JMP SCPARMS
  604. NOVERIFY:CMP AL,"D"
  605.  JNE NODATE
  606.  MOV DATE,1
  607.  MOV BP,SI
  608.  CALL INTELLIDATE
  609.  MOV AH,9
  610.  MOV DX,OFFSET DATEFILE
  611.  INT 21H
  612.  XOR DX,DX
  613.  MOV DI,OFFSET PROTECT
  614.  PUSH DI
  615.  MOV AX,MONTH
  616.  CALL BINTODEC
  617.  MOV AL,"-"
  618.  STOSB
  619.  MOV AX,DAY
  620.  CALL BINTODEC
  621.  MOV AX,"1-"
  622.  STOSW
  623.  MOV AX,YEAR
  624.  SUB AX,1000
  625.  CALL BINTODEC
  626.  MOV AX,"."+13*256
  627.  STOSW
  628.  MOV AX,10+"$"*256
  629.  STOSW
  630.  MOV AH,9
  631.  POP DX
  632.  INT 21H
  633.  
  634.  JMP SCPARMS
  635. NODATE:CMP AL,"W"
  636.  JNE NOWAITE
  637.  MOV AH,9
  638.  MOV DX,OFFSET WAITMSG
  639.  INT 21H
  640.  MOV AH,8
  641.  INT 21H
  642.  JMP SCPARMS
  643. NOWAITE:CMP AL,"E"
  644.  JNE NOAPPZ
  645.  MOV APPEND,1
  646. NOAPPZ:CMP AL,"H"
  647.  JNE NOHID
  648.  MOV ATTRCOPY,7
  649. NOHID:
  650.  
  651.  JMP SCPARMS
  652. ENDSCPARMS:POP CX SI
  653. SRCEFIND:LODSB
  654.  CMP AL,32
  655.  JNE FOUNDSRCE
  656.  LOOP SRCEFIND
  657.  JMP NOPARAM
  658. FOUNDSRCE:CMP AL,"/"
  659.  JNE OKSRCE
  660.  LODSB
  661.  CMP AL,"?"
  662.  JE SHOWHELP
  663.  CMP AL,"h"
  664.  JE SHOWHELP
  665.  JMP BADSOURCE
  666. SHOWHELP: ;DISPLAY HELP MESSAGE
  667.  MOV AH,9
  668.  MOV DX,OFFSET HELPMSG
  669.  INT 21H
  670.  JMP BOMB
  671. OKSRCE:MOV DI,OFFSET PROGEND
  672.  XCHG AL,AH
  673.  LODSB
  674.  CMP AL,BYTE PTR ":"
  675.  JE STORESDRV
  676.  DEC SI
  677.  DEC SI
  678.  MOV AH,19H
  679.  INT 21H
  680.  MOV AH,AL
  681.  ADD AH,"A"
  682.  MOV AL,":"
  683. STORESDRV:XCHG AL,AH
  684.  STOSW
  685.  LODSB
  686.  DEC SI
  687.  CMP AL,"\"
  688.  JE FULLPATH
  689.  MOV AL,"\"
  690.  STOSB
  691.  PUSH SI
  692.  MOV AH,47H
  693.  MOV DL,DS:[OFFSET PROGEND]
  694.  SUB DL,64
  695.  MOV SI,DI
  696.  INT 21H
  697.  JNC DOPATH
  698.  JMP BADSDRIVE
  699. DOPATH:DEC DI
  700. DOPATHB:INC DI
  701.  CMP ES:[DI],BYTE PTR 0
  702.  JNE DOPATHB
  703.  CMP ES:[DI-1],BYTE PTR "\"
  704.  JE ENDDOPATH2
  705.  MOV AL,"\"
  706.  STOSB
  707. ENDDOPATH2:POP SI
  708. FULLPATH:LODSB
  709.  CMP AL,"/"
  710.  JE ENDPATH
  711.  CMP AL," "
  712.  JE ENDPATH
  713.  OR AL,AL
  714.  JE ENDPATH
  715.  STOSB
  716.  JMP FULLPATH
  717. ENDPATH:DEC SI
  718.  XOR AL,AL
  719.  STOSB
  720.  MOV PARMOFF,SI
  721.  MOV SI,OFFSET PROGEND
  722.  MOV DI,SI
  723. SCANSPATH:LODSB
  724.  STOSB
  725.  OR AL,AL
  726.  JZ ENDSCANS
  727.  CMP AL,"."
  728.  JNE SCANSPATH
  729. SCANSF:LODSB
  730.  DEC SI
  731.  CMP AL,"."
  732.  JNE NOTPREVPATH
  733.  CMP ES:[DI-2],BYTE PTR "\"
  734.  JNE SCANSPATH
  735.  MOV AL,DS:[SI+1]
  736.  CMP AL,BYTE PTR "\"
  737.  JE NPSOK1
  738.  OR AL,AL
  739.  JNZ SCANSPATH
  740. NPSOK1:INC SI
  741.  SUB DI,2
  742. PREVSDIR:MOV AL,ES:[DI-1]
  743.  CMP AL,":"
  744.  JE SCANSPATH
  745.  DEC DI
  746.  CMP AL,"\"
  747.  JE SCANSPATH
  748.  JMP PREVSDIR
  749. NOTPREVPATH:CMP ES:[DI-2],BYTE PTR "\"
  750.  JNE SCANSPATH
  751.  SUB DI,2
  752.  JMP SCANSPATH
  753. ENDSCANS:DEC DI
  754.  MOV BP,DI
  755.  ADD BP,3
  756.  CMP ES:[DI-1],BYTE PTR "\"
  757.  JE NOTSLASH
  758.  MOV AL,"\"
  759.  STOSB
  760.  SUB BP,3
  761. NOTSLASH:MOV AX,".*"
  762.  STOSW
  763.  MOV AX,"*"
  764.  STOSW
  765.  MOV AH,1AH
  766.  MOV DX,OFFSET TYPEMSG
  767.  INT 21H
  768.  MOV AH,4EH
  769.  XOR CX,CX
  770.  MOV DX,OFFSET PROGEND
  771.  INT 21H
  772.  JNC SPATHOKB
  773.  CMP AX,3
  774.  JNE SPATHOKB
  775.  MOV DI,BP
  776.  XOR AL,AL
  777.  STOSB
  778. SPATHOKB:MOV NEXTPATH,DI
  779.  MOV DI,OFFSET TYPEMSG
  780.  PUSH DI
  781.  MOV SI,PARMOFF
  782. SCANDEST:LODSB
  783.  CMP AL,32
  784.  JE SCANDEST
  785.  DEC SI
  786. COPYDEST:LODSB
  787.  OR AL,AL
  788.  JZ ENDDEST
  789.  CMP AL,"/"
  790.  JE ENDDEST
  791.  CMP AL," "
  792.  JE ENDDEST
  793.  STOSB
  794.  JMP COPYDEST
  795. ENDDEST:DEC SI
  796.  MOV PARMOFF,SI
  797.  XOR AX,AX
  798.  STOSW
  799.  POP SI
  800.  MOV DI,NEXTPATH
  801.  LODSB
  802.  XCHG AL,AH
  803.  LODSB
  804.  CMP AL,BYTE PTR ":"
  805.  JE STOREDDRV
  806.  DEC SI
  807.  DEC SI
  808.  MOV AH,19H
  809.  INT 21H
  810.  MOV AH,AL
  811.  ADD AH,"A"
  812.  MOV AL,":"
  813. STOREDDRV:XCHG AL,AH
  814.  STOSW
  815.  LODSB
  816.  DEC SI
  817.  CMP AL,"\"
  818.  JE FULLPATHD
  819.  MOV AL,"\"
  820.  STOSB
  821.  PUSH SI
  822.  MOV AH,47H
  823.  MOV SI,NEXTPATH
  824.  MOV DL,[SI]
  825.  SUB DL,64
  826.  MOV SI,DI
  827.  INT 21H
  828.  JNC DOPATHD
  829.  JMP BADDDRIVE
  830. DOPATHD:DEC DI
  831. DOPATHBD:INC DI
  832.  CMP ES:[DI],BYTE PTR 0
  833.  JNE DOPATHBD
  834.  CMP ES:[DI-1],BYTE PTR "\"
  835.  JE ENDDOPATH2D
  836.  MOV AL,"\"
  837.  STOSB
  838. ENDDOPATH2D:POP SI
  839. FULLPATHD:LODSB
  840.  OR AL,AL
  841.  JE ENDPATHD
  842.  STOSB
  843.  JMP FULLPATHD
  844. ENDPATHD:DEC SI
  845.  XOR AL,AL
  846.  STOSB
  847.  MOV SI,NEXTPATH
  848.  MOV DI,SI
  849. SCANSPATHD:LODSB
  850.  STOSB
  851.  OR AL,AL
  852.  JZ ENDSCANSD
  853.  CMP AL,"."
  854.  JNE SCANSPATHD
  855. SCANSFD:LODSB
  856.  DEC SI
  857.  CMP AL,"."
  858.  JNE NOTPREVPATHD
  859.  CMP ES:[DI-2],BYTE PTR "\"
  860.  JNE SCANSPATHD
  861.  MOV AL,DS:[SI+1]
  862.  CMP AL,BYTE PTR "\"
  863.  JE NPSOK1D
  864.  OR AL,AL
  865.  JNZ SCANSPATHD
  866. NPSOK1D:INC SI
  867.  SUB DI,2
  868. PREVSDIRD:MOV AL,ES:[DI-1]
  869.  CMP AL,":"
  870.  JE SCANSPATHD
  871.  DEC DI
  872.  CMP AL,"\"
  873.  JE SCANSPATHD
  874.  JMP PREVSDIRD
  875. NOTPREVPATHD:CMP ES:[DI-2],BYTE PTR "\"
  876.  JNE SCANSPATHD
  877.  OR AL,AL
  878.  JNZ NOTEDST
  879.  INC DI
  880. NOTEDST:SUB DI,2
  881.  JMP SCANSPATHD
  882. ENDSCANSD:DEC DI
  883.  CMP ES:[DI-1],BYTE PTR "\"
  884.  JNE NOTSLASHDB
  885. GETSFILES:MOV SI,OFFSET PROGEND
  886. GSF1:LODSB
  887.  CMP AL,"\"
  888.  JNE GSF2
  889.  MOV BP,SI
  890. GSF2:OR AL,AL
  891.  JE GSF3
  892.  JMP GSF1
  893. GSF3:MOV SI,BP
  894. GSF4:LODSB
  895.  OR AL,AL
  896.  JNZ NENDDFIL1
  897.  JMP ENDDFIL
  898. NENDDFIL1:STOSB
  899.  JMP GSF4
  900. NOTSLASHDB:PUSH DI
  901. SCANWILD:DEC DI
  902.  CMP ES:[DI],BYTE PTR "?"
  903.  JNE NGOTWILD1
  904.  JMP GOTWILD
  905. NGOTWILD1:CMP ES:[DI],BYTE PTR "*"
  906.  JNE NGOTWILD2
  907.  JMP GOTWILD
  908. NGOTWILD2:CMP ES:[DI-1],BYTE PTR "\"
  909.  JNE SCANWILD
  910.  MOV SI,DI
  911.  POP DI
  912.  PUSH DI
  913.  MOV AX,"*\"
  914.  STOSW
  915.  MOV AX,"*."
  916.  STOSW
  917.  XOR AL,AL
  918.  STOSB
  919.  MOV AH,4EH
  920.  XOR CX,CX
  921.  MOV DX,NEXTPATH
  922.  INT 21H
  923.  JNC DPATHOKB
  924.  CMP AX,3
  925.  JNE DPATHOKB
  926.  MOV ES:[DI-5],BYTE PTR 0
  927.  JMP NOTSURE
  928. DPATHOKB:POP AX
  929.  DEC DI
  930.  JMP ENDDFIL
  931. NOTSURE:MOV DI,OFFSET TYPEMSG
  932.  MOV AX,"sI"
  933.  STOSW
  934.  MOV AX,"' "
  935.  STOSW
  936. SDFZA:LODSB
  937.  STOSB
  938.  CMP AL,"."
  939.  JNE NOTFILEY
  940.  JMP GOTWILD
  941. NOTFILEY:OR AL,AL
  942.  JNE SDFZA
  943.  DEC DI
  944.  MOV AL,"$"
  945.  STOSB
  946.  MOV AH,9
  947.  MOV DX,OFFSET TYPEMSG
  948.  INT 21H
  949.  MOV DX,OFFSET FILDIR
  950.  INT 21H
  951. FDKEY:MOV AH,8
  952.  INT 21H
  953.  CMP AL,"Z"
  954.  JNA FDKEY2
  955.  SUB AL,32
  956. FDKEY2:CMP AL,"F"
  957.  JE FDKEY4
  958. FDKEY3:CMP AL,"D"
  959.  JNE FDKEY
  960. FDKEY4:PUSH AX
  961.  MOV DL,AL
  962.  MOV AH,2
  963.  INT 21H
  964.  MOV DL,13
  965.  INT 21H
  966.  MOV DL,10
  967.  INT 21H
  968.  POP AX
  969.  CMP AL,"F"
  970.  JE GOTWILD
  971.  POP DI
  972.  MOV AX,"*\"
  973.  STOSW
  974.  MOV AX,"*."
  975.  STOSW
  976.  JMP ENDDFIL
  977. GOTWILD:POP DI
  978. ENDDFIL:MOV AX,2*256
  979.  STOSW
  980.  MOV NEXTPATH,DI
  981.  STOSB
  982.  MOV SI,NEXTPATH
  983.  STD
  984. SCWCS:LODSB
  985.  CMP AL,"\"
  986.  JNE SCWCS
  987.  CLD
  988.  INC SI
  989.  INC SI
  990.  PUSH SI
  991.  MOV DI,OFFSET RENFILE
  992.  MOV CX,8
  993. SCWCS2:LODSB
  994.  CMP AL,"*"
  995.  JNE NOTAST1
  996.  MOV AL,"?"
  997.  REP STOSB
  998.  JMP GETEXT
  999. NOTAST1:CMP AL,"."
  1000.  JNE NOTPUNT
  1001.  JMP GETEXT
  1002. NOTPUNT:OR AL,AL
  1003.  JNZ NOTZERO
  1004.  POP SI
  1005.  JMP TURBOCOPY
  1006. NOTZERO:STOSB
  1007.  LOOP SCWCS2
  1008. GETEXT:POP SI
  1009. SCWCS3:LODSB
  1010.  CMP AL,"."
  1011.  JE GOTEXT1
  1012.  OR AL,AL
  1013.  JNZ SCWCS3
  1014.  JMP TURBOCOPY
  1015. GOTEXT1:MOV CX,3
  1016.  MOV DI,OFFSET RENFILE+9
  1017. SCWCS4:LODSB
  1018.  CMP AL,"*"
  1019.  JNE NOTAST4
  1020.  MOV AL,"?"
  1021.  REP STOSB
  1022.  JMP TURBOCOPY
  1023. NOTAST4:OR AL,AL
  1024.  JZ TURBOCOPY
  1025.  STOSB
  1026.  LOOP SCWCS4
  1027.  
  1028. ;┌──────────────────────────────────────────────────────────────────┐
  1029. ;│MAIN COPYING ROUTINE                                              │
  1030. ;│SCANS THE LIST OF DIRECTORIES FOR THE HIGHEST PRIORITY (2 TO 255) │
  1031. ;│AND CONVERTS IT'S PRIORITY TO 1 (= ALREADY COPIED)                │
  1032. ;│IT THEN COPIES THE DIRECTORIES IN ACCORDANCE WITH THE PARAMETERS  │
  1033. ;│A 0 AFTER THE PRIORITY NUMBER INDICATES THE END OF THE LIST       │
  1034. ;│STORES PRIORITY+1 INTO PRIORITY (PRIORITY EQUALS X COORDINATE)    │
  1035. ;└──────────────────────────────────────────────────────────────────┘
  1036. TURBOCOPY:MOV YESNO,0
  1037.  MOV SI,OFFSET PROGEND
  1038.  PUSH SI
  1039. FNULA:LODSB
  1040.  DEC SI
  1041.  OR AL,AL
  1042.  JZ ENDCLEAN
  1043.  MOV DI,SI
  1044. FNULA1:LODSB
  1045.  OR AL,AL
  1046.  JNZ FNULA1
  1047. FNULB:LODSB
  1048.  OR AL,AL
  1049.  JNZ FNULB
  1050.  LODSB
  1051.  CMP AL,1
  1052.  JNE FNULA
  1053.  MOV CX,NEXTPATH
  1054.  SUB CX,SI
  1055.  INC CX
  1056.  ADD NEXTPATH,DI
  1057.  SUB NEXTPATH,SI
  1058.  PUSH DI
  1059.  CLD
  1060.  REP MOVSB
  1061.  POP SI
  1062.  JMP FNULA
  1063. ENDCLEAN:POP SI
  1064.  XOR DL,DL
  1065.  LODSB
  1066.  DEC SI
  1067.  OR AL,AL
  1068.  JE ENDOFCOPY
  1069. TC0:MOV BP,SI
  1070. TC1:LODSB
  1071.  OR AL,AL
  1072.  JNZ TC1
  1073. TC2:LODSB
  1074.  OR AL,AL
  1075.  JNZ TC2
  1076.  LODSB
  1077.  CMP AL,DL
  1078.  JNA NOTBETTER
  1079.  MOV DL,AL
  1080.  MOV CURPATH,BP
  1081.  JMP NOTEQUAL
  1082. NOTBETTER:JNE NOTEQUAL
  1083.  PUSH SI DI
  1084.  MOV SI,CURPATH
  1085.  MOV DI,BP
  1086.  CLD
  1087. SORT1:CMPSB
  1088.  JE SORT1
  1089.  POP DI SI
  1090.  JB NOTEQUAL
  1091.  MOV CURPATH,BP
  1092. NOTEQUAL:LODSB
  1093.  DEC SI
  1094.  OR AL,AL
  1095.  JNZ TC0
  1096.  CMP AL,1
  1097.  JE ENDOFCOPY
  1098.  JMP STILLTOCOPY
  1099. ENDOFCOPY:MOV SI,OFFSET TOTMSG
  1100.  MOV DI,OFFSET TYPEMSG
  1101.  PUSH DI
  1102.  MOV CX,22
  1103.  REP MOVSB
  1104.  MOV AX,WORD PTR TOTBYTES
  1105.  MOV DX,WORD PTR TOTBYTES[2]
  1106.  CALL BINTODEC
  1107.  MOV CX,10
  1108.  REP MOVSB
  1109.  MOV AX,WORD PTR TOTFILES
  1110.  MOV DX,WORD PTR TOTFILES[2]
  1111.  CALL BINTODEC
  1112.  MOV CX,5
  1113.  REP MOVSB
  1114.  MOV CX,27
  1115.  CMP WORD PTR TOTFILES[2],0
  1116.  JNE OKGU
  1117.  CMP WORD PTR TOTFILES,1
  1118.  JE NOKGUA
  1119.  JMP OKGUA
  1120. NOKGUA:DEC CX
  1121.  INC SI
  1122. OKGU:REP MOVSB
  1123.  MOV AH,2CH
  1124.  INT 21H
  1125.  MOV AX,BTIMECX
  1126.  MOV BX,BTIMEDX
  1127.  CMP CX,AX
  1128.  JAE NOMIDNIGHT
  1129.  ADD CH,24
  1130. NOMIDNIGHT:SUB DL,BL
  1131.  JNC HUNSECS
  1132.  PUSHF
  1133.  ADD DL,100
  1134.  POPF
  1135. HUNSECS:SBB DH,BH
  1136.  JNC SECS
  1137.  PUSHF
  1138.  ADD DH,60
  1139.  POPF
  1140. SECS:SBB CL,AL
  1141.  JNC MINS
  1142.  PUSHF
  1143.  ADD CL,60
  1144.  POPF
  1145. MINS:SBB CH,AH
  1146.  MOV BX,CX
  1147.  OR BH,BH
  1148.  JZ NOHOURS
  1149.  MOV AL,BH
  1150.  XOR AH,AH
  1151.  PUSH DX
  1152.  XOR DX,DX
  1153.  CALL BINTODEC
  1154.  POP DX
  1155.  MOV SI,OFFSET ENDMES2
  1156.  MOV CX,OFFSET ENDMES3-OFFSET ENDMES2
  1157.  CMP AL,1
  1158.  JNE NOTONEHOUR
  1159.  DEC CX
  1160. NOTONEHOUR:REP MOVSB
  1161.  OR DX,DX
  1162.  JNZ DXNOTNUL
  1163.  INC CL
  1164. DXNOTNUL:OR BL,BL
  1165.  JNZ BLNOTNUL
  1166.  INC CL
  1167. BLNOTNUL:SUB CL,1
  1168.  JNC ENDTIME
  1169.  JZ EITHERNUL
  1170.  MOV AX," ,"
  1171.  STOSW
  1172.  JMP SHORT NOHOURS
  1173. EITHERNUL:MOV SI,OFFSET ENDMES4
  1174.  MOV CX,5
  1175.  REP MOVSB
  1176. NOHOURS:OR BL,BL
  1177.  JZ NOMINUTES
  1178.  MOV AL,BL
  1179.  XOR AH,AH
  1180.  PUSH DX
  1181.  XOR DX,DX
  1182.  CALL BINTODEC
  1183.  POP DX
  1184.  MOV SI,OFFSET ENDMES3
  1185.  MOV CX,OFFSET ENDMES4-OFFSET ENDMES3
  1186.  CMP BL,1
  1187.  JNE NOTONEMINUTE
  1188.  DEC CX
  1189. NOTONEMINUTE:REP MOVSB
  1190.  OR DX,DX
  1191.  JE ENDTIME
  1192.  MOV SI,OFFSET ENDMES4
  1193.  MOV CX,5
  1194.  REP MOVSB
  1195. NOMINUTES:MOV AL,DH
  1196.  XOR AH,AH
  1197.  PUSH DX
  1198.  XOR DX,DX
  1199.  CALL BINTODEC
  1200.  POP DX
  1201.  OR DL,DL
  1202.  JZ NOHUNSECS
  1203.  MOV AL,"."
  1204.  STOSB
  1205.  CMP DL,10
  1206.  JNB BIGTNINE
  1207.  MOV AL,"0"
  1208.  STOSB
  1209. BIGTNINE:MOV AL,DL
  1210.  PUSH DX
  1211.  XOR DX,DX
  1212.  CALL BINTODEC
  1213.  POP DX
  1214.  CMP ES:[DI-1],BYTE PTR "0"
  1215.  JNE NOHUNSECS
  1216.  DEC DI
  1217. NOHUNSECS:MOV SI,OFFSET ENDMES5
  1218.  MOV CX,OFFSET BTIMEDX-OFFSET ENDMES5
  1219.  CMP DH,1
  1220.  JNE NOTONESECOND
  1221.  OR DL,DL
  1222.  JNZ NOTONESECOND
  1223.  DEC CX
  1224. NOTONESECOND:REP MOVSB
  1225. ENDTIME:MOV AX,13*256+"."
  1226.  STOSW
  1227.  MOV AX,10+36*256
  1228.  STOSW
  1229.  POP DX
  1230.  MOV AH,9
  1231.  INT 21H
  1232.  MOV DX,OFFSET ENDMES
  1233.  MOV AH,9
  1234.  INT 21H
  1235.  JMP BOMB
  1236. OKGUA:CMP WORD PTR TOTFILES,0
  1237.  JE NOKGU
  1238.  JMP OKGU
  1239. NOKGU:POP DX
  1240.  MOV DX,OFFSET NOFCOPY
  1241.  MOV AH,9
  1242.  INT 21H
  1243.  JMP BOMB
  1244. STILLTOCOPY:CMP DL,255
  1245.  JE MAXPRIO
  1246.  INC DL
  1247. MAXPRIO:MOV PRIORITY,DL
  1248.  MOV SI,CURPATH
  1249. PRIO1:LODSB
  1250.  OR AL,AL
  1251.  JNZ PRIO1
  1252.  MOV CURDEST,SI
  1253. PRIO2:LODSB
  1254.  OR AL,AL
  1255.  JNZ PRIO2
  1256.  MOV DS:[SI],BYTE PTR 1
  1257.  MOV DX,OFFSET CPMSG
  1258.  MOV AH,9
  1259.  INT 21H
  1260.  MOV DI,OFFSET TYPEMSG
  1261.  MOV DX,DI
  1262.  MOV SI,CURPATH
  1263. CPPRMSG:LODSB
  1264.  OR AL,AL
  1265.  JZ PRTOMSG
  1266.  STOSB
  1267.  JMP CPPRMSG
  1268. PRTOMSG:MOV AX,"t "
  1269.  STOSW
  1270.  MOV AX," o"
  1271.  STOSW
  1272. CPDSTMSG:LODSB
  1273.  OR AL,AL
  1274.  JZ CPEDLN
  1275.  STOSB
  1276.  JMP CPDSTMSG
  1277. CPEDLN:MOV AX,13+10*256
  1278.  STOSW
  1279.  MOV AL,"$"
  1280.  STOSB
  1281.  MOV AH,9
  1282.  INT 21H
  1283.  MOV SI,CURPATH
  1284.  MOV DI,CURDEST
  1285. COMPSD:LODSB
  1286.  MOV AH,ES:[DI]
  1287.  INC DI
  1288.  CMP AH,AL
  1289.  JNE NOTSAMSD
  1290.  OR AL,AL
  1291.  JNZ COMPSD
  1292.  MOV AH,9
  1293.  MOV DX,OFFSET SAMEMSG
  1294.  INT 21H
  1295.  JMP TURBOCOPY
  1296. NOTSAMSD:
  1297.  
  1298.  
  1299.  
  1300.  MOV SUBDIRS,0
  1301.  CMP COPDIRS,1
  1302.  JE COPDIOK
  1303.  JMP NOSUBDIRS
  1304.  
  1305. ;JMP TO NOSUBDIRS SO AS NOT TO COPY SUBDIRECTORIES
  1306. ;SCANS SOURCE FOR DIRS (AT DS:50000), UPDATE DIRLIST
  1307.  
  1308. COPDIOK:MOV SI,CURDEST
  1309. FINDSLZ:DEC SI
  1310.  CMP DS:[SI-1],BYTE PTR "\"
  1311.  JNE FINDSLZ
  1312.  PUSH SI
  1313.  MOV DI,SI
  1314.  LODSW
  1315.  PUSH AX
  1316.  LODSW
  1317.  PUSH AX
  1318.  MOV AX,".*"
  1319.  STOSW
  1320.  MOV AX,"*"
  1321.  STOSW
  1322.  MOV AH,4EH
  1323.  MOV CX,16 ;DIRECTORIES FIRST
  1324.  MOV DX,CURPATH
  1325.  INT 21H
  1326.  POP BX
  1327.  POP AX
  1328.  POP DI
  1329.  STOSW
  1330.  MOV AX,BX
  1331.  STOSW
  1332.  MOV DI,50000
  1333.  JNC FINDNEXT
  1334.  CMP AX,3
  1335.  JNE NOFILES
  1336.  MOV AH,9
  1337.  MOV DX,OFFSET BADSPATH
  1338.  INT 21H
  1339.  JMP TURBOCOPY
  1340. NOFILES:JMP NOSUBDIRS
  1341. FINDNEXT:INC SUBDIRS
  1342.  MOV SI,OFFSET TYPEMSG+21
  1343.  MOV CX,11
  1344.  REP MOVSW
  1345.  MOV AH,4FH
  1346.  INT 21H
  1347.  JNC FINDNEXT
  1348.  MOV CX,SUBDIRS
  1349.  MOV SUBDIRS,0
  1350.  MOV SI,50000
  1351. SCANDIRS:MOV BP,SI
  1352.  LODSB
  1353.  ADD SI,21
  1354.  CMP AL,16
  1355.  JE OKDIR
  1356. NOTOKDIR:JMP ENDDIR
  1357. OKDIR:CMP DS:[SI-13],BYTE PTR "."      ;DON'T WANT ".." OR "." DIRECTORIES
  1358.  JE NOTOKDIR
  1359.  INC SUBDIRS
  1360.  PUSH SI CX
  1361.  MOV SI,CURDEST
  1362.  STD
  1363.  DEC SI
  1364.  XOR CX,CX
  1365. SCANFSL:INC CX
  1366.  LODSB
  1367.  CMP AL,"\"
  1368.  JNE SCANFSL
  1369.  INC SI
  1370.  PUSH SI CX
  1371.  CLD
  1372.  MOV CX,SI
  1373.  MOV SI,CURPATH
  1374.  SUB CX,SI
  1375.  MOV DI,NEXTPATH
  1376.  REP MOVSB
  1377.  MOV AL,"\"
  1378.  STOSB
  1379.  MOV SI,BP
  1380.  ADD SI,9
  1381. COPDIR:LODSB
  1382.  OR AL,AL
  1383.  JZ ENDDIRC
  1384.  STOSB
  1385.  JMP COPDIR
  1386. ENDDIRC:POP CX SI
  1387.  REP MOVSB
  1388.  MOV SI,CURDEST
  1389. SCANSFL:LODSB
  1390.  OR AL,AL
  1391.  JE OKFLSL
  1392.  CMP AL,"\"
  1393.  JNE SCANSFL
  1394.  MOV BX,SI
  1395.  JMP SCANSFL
  1396. OKFLSL:MOV CX,BX
  1397.  MOV SI,CURDEST
  1398.  SUB CX,SI
  1399.  REP MOVSB
  1400.  CMP NOCREATE,1
  1401.  JE COPDIRE
  1402.  PUSH SI
  1403.  MOV SI,BP
  1404.  ADD SI,9
  1405. COPDIRD:LODSB
  1406.  OR AL,AL
  1407.  JZ ENDDIRCD
  1408.  STOSB
  1409.  JMP COPDIRD
  1410. ENDDIRCD:POP SI
  1411.  MOV AL,"\"
  1412.  STOSB
  1413. COPDIRE:LODSB
  1414.  STOSB
  1415.  OR AL,AL
  1416.  JZ ENDDIRCE
  1417.  JMP COPDIRE
  1418. ENDDIRCE:MOV AL,PRIORITY
  1419.  STOSB
  1420.  MOV NEXTPATH,DI
  1421.  XOR AL,AL
  1422.  STOSB
  1423.  POP CX SI
  1424. ENDDIR:DEC CX
  1425.  JZ NOSUBDIRS
  1426.  JMP SCANDIRS
  1427.  
  1428.  
  1429. NOSUBDIRS: ;JUMP HERE SO AS NOT TO COPY SUBDIRECTORIES
  1430.  
  1431.  MOV DI,50000
  1432.  MOV FILES,0
  1433.  MOV AH,4EH
  1434.  MOV CX,ATTRCOPY ;FILE ATTRIBUTE MUST BE PUT IN HERE NB!!! (7 TO INCLUDE ALL)
  1435.  MOV DX,CURPATH
  1436.  INT 21H
  1437.  JNC FINDNEXTF
  1438.  CMP AX,3
  1439.  JNE NOFILESF
  1440.  MOV AH,9
  1441.  MOV DX,OFFSET BADSPATH
  1442.  INT 21H
  1443.  JMP TURBOCOPY
  1444. NOFILESF:MOV AH,9
  1445.  MOV DX,OFFSET EMPDIR
  1446.  INT 21H
  1447.  JMP TURBOCOPY
  1448. FINDNEXTF:MOV SI,OFFSET TYPEMSG+21
  1449.  CMP ARCHIVE,0
  1450.  JE NOARC
  1451.  MOV AL,DS:[SI]
  1452.  AND AL,32
  1453.  JZ NTFILE
  1454. NOARC:CMP DATE,1
  1455.  JNE NODATE2
  1456.  MOV AX,DS:[SI+3]
  1457.  MOV CL,AH
  1458.  SHR CL,1
  1459.  XOR CH,CH
  1460.  ADD CX,1980
  1461.  CMP CX,YEAR
  1462.  JA YTFILE
  1463.  JB NTFILE
  1464.  MOV CX,AX
  1465.  SHR CX,1
  1466.  SHR CX,1
  1467.  SHR CX,1
  1468.  SHR CX,1
  1469.  SHR CX,1
  1470.  AND CX,15
  1471.  CMP CX,MONTH
  1472.  JA YTFILE
  1473.  JB NTFILE
  1474.  AND AX,31
  1475.  CMP AX,DAY
  1476.  JB NTFILE
  1477. NODATE2:
  1478.  
  1479. ;CHECK HERE IF FILE IS OK TO COPY ELSE: JMP NTFILE
  1480.  
  1481.  
  1482.  
  1483. YTFILE:MOV CX,11
  1484.  REP MOVSW
  1485.  INC FILES
  1486. NTFILE:MOV AH,4FH
  1487.  INT 21H
  1488.  JNC FINDNEXTF
  1489.  MOV CX,FILES
  1490.  JCXZ NOFILESF
  1491.  MOV SI,50005
  1492.  MOV FLOPSIZ36,0
  1493.  MOV FLOPSIZ12,0
  1494. FLSIZES:XOR DX,DX
  1495.  LODSW
  1496.  ADD AX,511
  1497.  ADC DX,DS:[SI]
  1498.  ADD SI,20
  1499.  PUSH AX DX
  1500.  MOV BX,512
  1501.  DIV BX
  1502.  ADD FLOPSIZ12,AX
  1503.  POP DX AX
  1504.  ADD AX,512
  1505.  ADC DX,0
  1506.  MOV BX,1024
  1507.  DIV BX
  1508.  ADD FLOPSIZ36,AX
  1509.  LOOP FLSIZES
  1510.  MOV AX,FLOPSIZ36
  1511.  ADD AX,353
  1512.  XOR DX,DX
  1513.  MOV BX,354
  1514.  DIV BX
  1515.  MOV FLOPSIZ36,AX
  1516.  MOV AX,FLOPSIZ12
  1517.  ADD AX,2370
  1518.  XOR DX,DX
  1519.  MOV BX,2371
  1520.  DIV BX
  1521.  MOV FLOPSIZ12,AX
  1522.  MOV CX,FILES
  1523.  MOV SI,50005
  1524.  XOR BX,BX
  1525.  XOR DX,DX
  1526. CSIZES:LODSW
  1527.  ADD BX,AX
  1528.  LODSW
  1529.  ADC DX,AX
  1530.  ADD SI,18
  1531.  LOOP CSIZES
  1532.  MOV DI,OFFSET TYPEMSG
  1533.  PUSH DI
  1534.  MOV AL,32
  1535.  STOSB
  1536.  MOV AX,BX
  1537.  CALL BINTODEC
  1538.  MOV SI,OFFSET FILBYT
  1539.  MOV CX,10
  1540.  REP MOVSB
  1541.  MOV AX,FILES
  1542.  XOR DX,DX
  1543.  CALL BINTODEC
  1544.  MOV CX,13
  1545.  REP MOVSB
  1546.  CMP FILES,1
  1547.  JNE NOTONEFILE
  1548.  DEC DI
  1549. NOTONEFILE:MOV AX," ."
  1550.  STOSW
  1551.  MOV AL,"("
  1552.  STOSB
  1553.  MOV AX,FLOPSIZ36
  1554.  XOR DX,DX
  1555.  CALL BINTODEC
  1556.  MOV AX,"3x"
  1557.  STOSW
  1558.  MOV AX,"06"
  1559.  STOSW
  1560.  MOV AX,",K"
  1561.  STOSW
  1562.  MOV AL," "
  1563.  STOSB
  1564.  MOV AX,FLOPSIZ12
  1565.  XOR DX,DX
  1566.  CALL BINTODEC
  1567.  MOV AX,"1x"
  1568.  STOSW
  1569.  MOV AX,"2."
  1570.  STOSW
  1571.  MOV AX,")M"
  1572.  STOSW
  1573.  MOV AX," ."
  1574.  STOSW
  1575.  MOV AX,SUBDIRS
  1576.  OR AX,AX
  1577.  JE NOSUBDIRSA
  1578.  XOR DX,DX
  1579.  CALL BINTODEC
  1580.  MOV CX,15
  1581.  REP MOVSB
  1582.  CMP SUBDIRS,1
  1583.  JNE NOTONESDIR
  1584.  SUB DI,3
  1585.  MOV AL,"y"
  1586.  STOSB
  1587. NOTONESDIR:MOV AL,"."
  1588.  STOSB
  1589. NOSUBDIRSA:MOV AX,13+10*256
  1590.  STOSW
  1591.  MOV AL,"$"
  1592.  STOSB
  1593.  POP DX
  1594.  MOV AH,9
  1595.  INT 21H
  1596.  MOV DI,NEXTPATH
  1597.  INC DI
  1598. SCANFMAIN:MOV SI,50000
  1599.  XOR DX,DX
  1600.  XOR CX,CX  ;DX:CX IS SIZE OF FILE
  1601.  XOR BP,BP  ;DS:BP IS OFFSET OF FILE
  1602.  MOV BX,FILES
  1603. SCANFFIL:LODSB
  1604.  DEC SI
  1605.  CMP AL,255
  1606.  JE SCANFNEXT
  1607.  CMP DX,DS:[SI+7]
  1608.  JA SCANFNEXT
  1609.  JB OKFOUNDL
  1610.  CMP CX,DS:[SI+5]
  1611.  JA SCANFNEXT
  1612. OKFOUNDL:MOV DX,DS:[SI+7]
  1613.  MOV CX,DS:[SI+5]
  1614.  MOV BP,SI
  1615. SCANFNEXT:ADD SI,22
  1616.  DEC BX
  1617.  JNZ SCANFFIL
  1618.  OR BP,BP
  1619.  JE FINSORT
  1620.  MOV CX,22
  1621.  MOV SI,BP
  1622.  XOR AL,AL
  1623.  STOSB
  1624.  REP MOVSB
  1625.  MOV DS:[BP],BYTE PTR 255
  1626.  JMP SCANFMAIN
  1627. FINSORT:
  1628.  
  1629.  
  1630.  
  1631. ;HERE IS THE MAIN COPY ROUTINE:
  1632. ;GET SIZE OF DISK; CREATE DIRECTORIES; COPY FILES; PROMPT FOR NEW DISK; REDO
  1633.  
  1634. MAINCOPY:MOV ROPEN,0 ;NO FILES ARE OPEN
  1635.  MOV DI,OFFSET TYPEMSG
  1636.  PUSH DI
  1637.  MOV AL,32
  1638.  STOSB
  1639.  MOV SI,CURDEST
  1640.  LODSB
  1641.  SUB AL,64
  1642.  MOV DL,AL
  1643.  MOV AH,36H
  1644.  INT 21H
  1645.  CMP AX,65535
  1646.  JNE DESTOK1
  1647.  POP DX
  1648.  MOV DX,OFFSET BADDEST2
  1649.  MOV AH,9
  1650.  INT 21H
  1651.  JMP BOMB
  1652. DESTOK1:MUL CX
  1653.  MOV ALLOC,AX
  1654.  MOV FREEALC,BX
  1655.  MUL BX
  1656.  CALL BINTODEC
  1657.  MOV SI,OFFSET DAVAIL
  1658.  MOV CX,41
  1659.  REP MOVSB
  1660.  POP DX
  1661.  MOV AH,9
  1662.  INT 21H
  1663.  CMP PROMPT,1
  1664.  JNE OKCOPY1AB
  1665.  CMP YESNO,1
  1666.  JE OKCOPY1AB
  1667.  MOV YESNO,1
  1668.  MOV DX,OFFSET PROMPTMSG
  1669.  MOV AH,9
  1670.  INT 21H
  1671. GETREP1LB:MOV AH,8
  1672.  INT 21H
  1673.  CMP AL,"a"
  1674.  JB GR1LB
  1675.  CMP AL,"z"
  1676.  JA GR1LB
  1677.  SUB AL,32
  1678. GR1LB:CMP AL,"Y"
  1679.  JNE GRNSLB
  1680.  JMP GR2LB
  1681. GRNSLB:CMP AL,"N"
  1682.  JNE GETREP1LB
  1683. GR2LB:MOV DL,AL
  1684.  PUSH AX
  1685.  MOV AH,2
  1686.  INT 21H
  1687.  MOV DL,13
  1688.  INT 21H
  1689.  MOV DL,10
  1690.  INT 21H
  1691.  POP AX
  1692.  CMP AL,"Y"
  1693.  JE OKCOPY1AB
  1694.  JMP TURBOCOPY
  1695. OKCOPY1AB:MOV FILYET,16
  1696.  MOV AH,4EH
  1697.  XOR CX,CX
  1698.  MOV DX,CURDEST
  1699.  INT 21H
  1700.  JNC DPATHOKZ
  1701.  CMP AX,3
  1702.  JNE DPATHOKZ
  1703.  MOV AH,9
  1704.  MOV DX,OFFSET CRDIR
  1705.  INT 21H
  1706.  MOV SI,CURDEST
  1707.  ADD SI,3
  1708. FINDBSL1:LODSB
  1709.  OR AL,AL
  1710.  JE DPATHOKX
  1711.  CMP AL,"\"
  1712.  JNE FINDBSL1
  1713.  DEC SI
  1714.  MOV DS:[SI],BYTE PTR 0
  1715.  MOV DX,CURDEST
  1716.  MOV AH,39H
  1717.  INT 21H
  1718.  PUSHF
  1719.  DEC FREEALC
  1720.  POPF
  1721.  JC BADCREAT
  1722.  MOV FILYET,2
  1723.  JMP OKCREAT
  1724. BADCREAT:INC FREEALC
  1725.  CMP AL,3
  1726.  JE NOCREAT
  1727. OKCREAT:MOV DS:[SI],BYTE PTR "\"
  1728.  INC SI
  1729.  JMP FINDBSL1
  1730. DPATHOKX:SAHF
  1731.  JNC DPATHOKZ
  1732. NOCREAT:MOV AH,9
  1733.  MOV DX,OFFSET BADCDIR
  1734.  INT 21H
  1735.  JMP TURBOCOPY
  1736. DPATHOKZ:MOV SI,CURDEST
  1737.  LODSB
  1738.  SUB AL,64
  1739.  MOV DL,AL
  1740.  MOV AH,36H
  1741.  INT 21H
  1742.  MUL CX
  1743.  MOV FREEALC,BX
  1744.  MOV RESERVE,0
  1745.  MOV SI,NEXTPATH
  1746. SCNAF1:LODSB
  1747.  OR AL,AL
  1748.  JNE SCNAF1
  1749.  STD
  1750.  DEC SI
  1751. SCNAF:LODSB
  1752.  CMP AL,"\"
  1753.  JNE SCNAF
  1754.  CLD
  1755.  LODSB
  1756.  CMP AL,":"
  1757.  JE ROOTOK
  1758.  MOV RESERVE,1
  1759. ROOTOK:MOV SI,NEXTPATH
  1760.  INC SI
  1761.  MOV CX,FILES
  1762.  MOV FIL2COPY,0
  1763.  MOV ALLFIL,0
  1764.  MOV AX,FREEALC
  1765. MARKFILES:LODSB  ;FILES TO COPY=16,0=NOT COPIED YET
  1766.  DEC SI
  1767.  CMP AL,255
  1768.  JE MARKNEXT
  1769.  CMP AL,16
  1770.  JNE NOTALMARK
  1771.  MOV DS:[SI],BYTE PTR 0
  1772. NOTALMARK:MOV AX,DS:[SI+6]
  1773.  MOV DX,DS:[SI+8]
  1774.  MOV BX,ALLOC
  1775.  DEC BX
  1776.  ADD AX,BX
  1777.  JNC NOOVER1
  1778.  INC DX
  1779. NOOVER1:DIV ALLOC
  1780.  MOV BX,FREEALC
  1781.  ;ADJUST BX TO INCLUDE DIRECTORIES
  1782.  CMP RESERVE,0
  1783.  JE NOTRESOK
  1784.  PUSH AX
  1785.  MOV AX,FIL2COPY
  1786.  ADD AX,FILYET
  1787.  MOV DL,16
  1788.  DIV DL
  1789.  XOR AH,AH
  1790.  SUB BX,AX
  1791.  POP AX
  1792.  JNC NOTRESOK
  1793.  JMP MARKNEXT
  1794. NOTRESOK:CMP AX,BX
  1795.  JNA NOMARKNEXT
  1796.  MOV ALLFIL,255
  1797.  JMP MARKNEXT
  1798. NOMARKNEXT:SUB FREEALC,AX
  1799.  MOV DS:[SI],BYTE PTR 16
  1800.  INC FIL2COPY
  1801. MARKNEXT:ADD SI,23
  1802.  LOOP MARKFILES
  1803.  CMP FIL2COPY,0
  1804.  JNZ OKCOPYA
  1805.  MOV DX,OFFSET NFTC
  1806.  MOV AH,9
  1807.  INT 21H
  1808.  JMP NEWDISK
  1809. OKCOPYA:CMP ALLFIL,0
  1810.  JE OKCOPY
  1811.  CMP PROCEED,1
  1812.  JE OKCOPY
  1813.  MOV SI,CURDEST
  1814.  LODSB
  1815.  MOV BL,AL
  1816.  SUB BL,64
  1817.  MOV AX,44H*256+8
  1818.  INT 21H
  1819.  JC NONREMA
  1820.  OR AX,AX
  1821.  JNZ NONREMA
  1822.  JMP OKCOPY
  1823. NONREMA:ADD BL,64
  1824.  MOV CS:[OFFSET DISKLESS2],BL
  1825.  MOV DX,OFFSET DISKLESS
  1826.  MOV AH,9
  1827.  INT 21H
  1828. GETREP1L:MOV AH,8
  1829.  INT 21H
  1830.  CMP AL,"a"
  1831.  JB GR1L
  1832.  CMP AL,"z"
  1833.  JA GR1L
  1834.  SUB AL,32
  1835. GR1L:CMP AL,"A"
  1836.  JNE GRNSL
  1837.  JMP GR2L
  1838. GRNSL:CMP AL,"P"
  1839.  JNE GETREP1L
  1840. GR2L:MOV DL,AL
  1841.  PUSH AX
  1842.  MOV AH,2
  1843.  INT 21H
  1844.  MOV DL,13
  1845.  INT 21H
  1846.  MOV DL,10
  1847.  INT 21H
  1848.  POP AX
  1849.  MOV PROCEED,1
  1850.  CMP AL,"P"
  1851.  JE OKCOPY
  1852.  JMP BOMB
  1853. OKCOPY:MOV DX,FILES
  1854. BUBSORT:MOV SI,NEXTPATH
  1855.  INC SI
  1856.  DEC DX
  1857.  OR DX,DX
  1858.  JZ SORTED
  1859.  MOV CX,DX
  1860. BUBSORT2:MOV DI,SI
  1861.  ADD DI,23
  1862.  LODSB
  1863.  DEC SI
  1864.  CMP AL,16
  1865.  JNE BUBSORTNXT
  1866.  CMP ES:[DI],BYTE PTR 16
  1867.  JNE OKSWAP
  1868.  PUSH SI DI CX
  1869.  ADD SI,10
  1870.  ADD DI,10
  1871.  MOV CX,13
  1872.  REP CMPSB
  1873.  POP CX DI SI
  1874.  JA OKSWAP
  1875.  JMP BUBSORTNXT
  1876. OKSWAP:PUSH SI CX
  1877.  MOV CX,23
  1878. SWAP:LODSB
  1879.  MOV AH,ES:[DI]
  1880.  STOSB
  1881.  MOV DS:[SI-1],AH
  1882.  LOOP SWAP
  1883.  POP CX SI
  1884. BUBSORTNXT:ADD SI,23
  1885.  LOOP BUBSORT2
  1886.  JMP BUBSORT
  1887. SORTED:MOV AX,FILES
  1888.  MOV BX,23
  1889.  MUL BX
  1890.  ADD AX,NEXTPATH
  1891.  ADD AX,16
  1892.  MOV CL,4
  1893.  SHR AX,CL
  1894.  MOV READPARA,AX  ;READPARA CONTAINS CURRENT PARAGRAPH FROM CS, MEM=MAX PARAS
  1895.  MOV BEGINPARA,AX
  1896.  MOV DX,OFFSET READMSG
  1897.  MOV AH,9
  1898.  INT 21H
  1899.  MOV SI,NEXTPATH
  1900.  INC SI
  1901.  MOV CX,FILES
  1902.  MOV FREAD,0
  1903. SCANFORFIL:LODSB
  1904.  DEC SI
  1905.  CMP AL,16
  1906.  JNE SCNEXTFIL
  1907.  JMP DOREAD
  1908. SCNEXTFIL:ADD SI,23
  1909.  LOOP SCANFORFIL
  1910.  PUSH CX SI
  1911.  CALL WRITE
  1912.  POP SI CX
  1913. OKDISKEND:MOV AX,FIL2COPY
  1914.  SUB FILES,AX
  1915.  JNZ NENDOFDIR
  1916.  JMP ENDOFDIR
  1917. NENDOFDIR:MOV AH,2
  1918.  MOV DL,13
  1919.  INT 21H
  1920.  MOV DL,10
  1921.  INT 21H
  1922.  MOV DL,13
  1923.  INT 21H
  1924.  MOV DL,10
  1925.  INT 21H
  1926.  JMP MAINCOPY
  1927. NEWDISK:PUSH CS
  1928.  POP DS
  1929.  MOV SI,CURDEST
  1930.  LODSB
  1931.  MOV DI,OFFSET NEWDMSG2
  1932.  STOSB
  1933.  MOV BL,AL
  1934.  SUB BL,64
  1935.  MOV AX,44H*256+8
  1936.  INT 21H
  1937.  JC NONREM
  1938.  OR AX,AX
  1939.  JZ REMOK
  1940. NONREM:ADD CS:[OFFSET DISKFULL2],BL
  1941.  MOV DX,OFFSET DISKFULL
  1942.  MOV AH,9
  1943.  INT 21H
  1944.  JMP BOMB
  1945. REMOK:MOV CX,FILES
  1946.  MOV SI,NEXTPATH
  1947.  ADD SI,7
  1948.  XOR BX,BX
  1949.  XOR DX,DX
  1950. CSIZES2:LODSW
  1951.  ADD BX,AX
  1952.  LODSW
  1953.  ADC DX,AX
  1954. NOTADD1:ADD SI,19
  1955.  LOOP CSIZES2
  1956.  MOV DI,OFFSET TYPEMSG
  1957.  MOV SI,OFFSET STCOPY1
  1958.  MOV CX,19
  1959.  REP MOVSB
  1960.  PUSH DX
  1961.  XOR DX,DX
  1962.  MOV AX,FILES
  1963.  CALL BINTODEC
  1964.  MOV CX,5
  1965.  REP MOVSB
  1966.  CMP FILES,1
  1967.  JE ONEFILE
  1968.  MOV AL,"s"
  1969.  STOSB
  1970. ONEFILE:MOV CX,12
  1971.  REP MOVSB
  1972.  POP DX
  1973.  MOV AX,BX
  1974.  CALL BINTODEC
  1975.  MOV CX,8
  1976.  REP MOVSB
  1977.  MOV DX,OFFSET TYPEMSG
  1978.  MOV AH,9
  1979.  INT 21H
  1980.  MOV DX,OFFSET NEWDMSG
  1981.  MOV AH,9
  1982.  INT 21H
  1983.  MOV DI,OFFSET TYPEMSG
  1984.  PUSH DI
  1985.  INC DISKS
  1986.  MOV AX,DISKS
  1987.  XOR DX,DX
  1988.  CALL BINTODEC
  1989.  MOV AL,"$"
  1990.  STOSB
  1991.  POP DX
  1992.  MOV AH,9
  1993.  INT 21H
  1994.  MOV DX,OFFSET NEWDMSG1
  1995.  MOV AH,9
  1996.  INT 21H
  1997.  MOV AH,8
  1998.  INT 21H
  1999.  AND AL,223
  2000.  CMP AL,"S"
  2001.  JE SHELLDOS
  2002.  JMP MAINCOPY
  2003. SHELLDOS:PUSH CS
  2004.  POP ES
  2005.  MOV BX,23
  2006.  MOV AX,FILES
  2007.  MUL BX
  2008.  ADD AX,NEXTPATH
  2009.  ADD AX,15
  2010.  MOV CL,4
  2011.  SHR AX,CL
  2012.  MOV BX,AX
  2013.  MOV AH,4AH
  2014.  INT 21H
  2015.  MOV AX,SS
  2016.  MOV BX,SP
  2017.  MOV WORD PTR WAITMSG,AX
  2018.  MOV WORD PTR WAITMSG[2],BX
  2019.  MOV DI,OFFSET SHPARM+2
  2020.  MOV [DI],OFFSET PARM
  2021.  MOV [DI+2],CS
  2022.  
  2023.  PUSH AX CX DS ES SI DI
  2024.  MOV AX,CS:[2CH]
  2025.  MOV DS,AX
  2026.  XOR SI,SI
  2027.  PUSH CS
  2028.  POP ES
  2029. GETCOMSPECLP:LODSB
  2030.  OR AL,AL
  2031.  JNZ CHKCOM
  2032.  CMP DS:[SI],AL
  2033.  JNE GETCOMSPECLP
  2034.  PUSH CS
  2035.  POP DS
  2036.  MOV SI,OFFSET SHELL
  2037.  JMP GOTSPEC2
  2038. CHKCOM:CMP AL,"C"
  2039.  JNE GETCOMSPECLP
  2040.  MOV DI,OFFSET COMSPEC
  2041.  PUSH SI
  2042.  MOV CX,7
  2043.  REPE CMPSB
  2044.  JCXZ GOTSPEC
  2045.  POP SI
  2046.  JMP GETCOMSPECLP
  2047. GOTSPEC:POP AX
  2048. GOTSPEC2:MOV DI,OFFSET SHELL
  2049. GOTSPEC3:LODSB
  2050.  STOSB
  2051.  OR AL,AL
  2052.  JNZ GOTSPEC3
  2053.  POP DI SI ES DS CX AX
  2054.  
  2055.  MOV AX,4BH*256
  2056.  MOV DX,OFFSET SHELL
  2057.  MOV BX,OFFSET SHPARM
  2058.  INT 21H
  2059.  MOV AX,WORD PTR WAITMSG
  2060.  MOV BX,WORD PTR WAITMSG[2]
  2061.  CLI
  2062.  MOV SS,AX
  2063.  MOV SP,BX
  2064.  STI
  2065.  JNC OVLOK
  2066.  MOV DX,OFFSET ERRLOAD
  2067.  MOV AH,9
  2068.  PUSH CS
  2069.  POP DS
  2070.  INT 21H
  2071. OVLOK:PUSH CS
  2072.  POP ES
  2073.  MOV BX,MEM
  2074.  MOV AH,4AH
  2075.  INT 21H
  2076.  JNC OVLOKMEM
  2077.  PUSH CS
  2078.  POP DS
  2079.  MOV AH,9
  2080.  MOV DX,OFFSET RECERR
  2081.  INT 21H
  2082.  JMP BOMB
  2083. OVLOKMEM:DEC DISKS
  2084.  JMP NEWDISK
  2085.  
  2086. ;WRITE FILES THAT ARE STILL TO BE WRITTEN
  2087.  
  2088. ;SUBTRACT FIL2COPY FROM FILES (PERMANENTLY)
  2089. ;IF NOT ZERO JMP TO ROUTINE THAT ASKS FOR NEW DISK
  2090. ;ELSE JUMP TO TURBOCOPY
  2091.  
  2092. ENDOFDIR:JMP TURBOCOPY
  2093.  
  2094. DOREAD:PUSH CX SI
  2095.  ADD SI,10
  2096.  MOV DX,SI
  2097. PRNAME:LODSB
  2098.  OR AL,AL
  2099.  JNZ PRNAME
  2100.  CALL PRFILENAME
  2101.  MOV SI,CURDEST
  2102.  STD
  2103. GETSLL:LODSB
  2104.  CMP AL,"\"
  2105.  JNE GETSLL
  2106.  CLD
  2107.  MOV CX,SI
  2108.  MOV SI,CURPATH
  2109.  SUB CX,SI
  2110.  INC CX
  2111.  INC CX
  2112.  MOV DI,OFFSET PROTECT
  2113.  REP MOVSB
  2114.  POP SI
  2115.  PUSH SI
  2116.  ADD SI,10
  2117.  MOV CX,13
  2118.  REP MOVSB
  2119.  POP SI
  2120.  PUSH SI
  2121.  MOV AX,DS:[SI+6]
  2122.  MOV WORD PTR FSIZ,AX
  2123.  MOV AX,DS:[SI+8]
  2124.  MOV WORD PTR FSIZ[2],AX
  2125.  INC FREAD
  2126.  MOV AX,3DH*256+160
  2127.  MOV DX,OFFSET PROTECT
  2128.  INT 21H
  2129.  MOV RHANDLE,AX
  2130.  JNC OPENFREAD
  2131.  JMP ERRREADF2
  2132.  
  2133. OPENFREAD:MOV AX,CS
  2134.  ADD AX,READPARA
  2135.  MOV DS,AX
  2136.  MOV CX,CS
  2137.  ADD CX,MEM
  2138.  SUB CX,AX
  2139.  JNZ STILLMEM
  2140.  CALL WRITE
  2141.  PUSH CS
  2142.  POP DS
  2143.  MOV AX,BEGINPARA
  2144.  MOV READPARA,AX
  2145.  POP SI
  2146.  PUSH SI
  2147.  CMP DS:[SI],BYTE PTR 255
  2148.  JNE NCLOSEF
  2149.  POP SI CX
  2150.  MOV AH,3EH
  2151.  MOV BX,RHANDLE
  2152.  INT 21H
  2153.  JNC ERRREADF2NO
  2154.  JMP ERRREADF2
  2155. ERRREADF2NO:CMP ARCHIVE,1
  2156.  JNE NOARC2B
  2157.  PUSH CX
  2158.  MOV AX,1+43H*256
  2159.  MOV CL,DS:[SI+1]
  2160.  AND CL,223
  2161.  XOR CH,CH
  2162.  MOV DX,OFFSET PROTECT
  2163.  INT 21H
  2164.  POP CX
  2165.  JNC NOARC2B
  2166.  MOV AH,9
  2167.  MOV DX,OFFSET ARCERR
  2168.  INT 21H
  2169.  JMP BOMB
  2170. NOARC2B:MOV AX,FREAD
  2171.  CMP AX,FIL2COPY
  2172.  JNE OKOK
  2173.  JMP OKDISKEND
  2174. OKOK:MOV AH,9
  2175.  MOV DX,OFFSET READMSG
  2176.  INT 21H
  2177.  JMP SCNEXTFIL
  2178. NCLOSEF:MOV AH,9
  2179.  MOV DX,OFFSET READMSG
  2180.  INT 21H
  2181.  ADD SI,10
  2182.  MOV DX,SI
  2183. PRNAMEB:LODSB
  2184.  OR AL,AL
  2185.  JNZ PRNAMEB
  2186.  CALL PRFILENAME
  2187.  JMP OPENFREAD
  2188.  
  2189. STILLMEM:CMP CX,4095
  2190.  JNA NOT2MUCH
  2191.  MOV CX,4095
  2192. NOT2MUCH:SHL CX,1
  2193.  SHL CX,1
  2194.  SHL CX,1
  2195.  SHL CX,1
  2196.  PUSH CX
  2197.  MOV AH,3FH
  2198.  MOV BX,RHANDLE
  2199.  XOR DX,DX
  2200.  INT 21H
  2201.  PUSH CS
  2202.  POP DS
  2203.  POP CX
  2204.  JNC READFOK1
  2205. ERRREADF: ;ERROR READING SOURCE FILE
  2206.  MOV AH,3EH
  2207.  MOV BX,RHANDLE
  2208.  INT 21H
  2209. ERRREADF2:MOV DX,OFFSET ERRRFIL
  2210.  MOV AH,9
  2211.  INT 21H
  2212.  JMP BOMB
  2213.  
  2214. READFOK1:CMP AX,CX
  2215.  JNE NLOTSLEFT
  2216.  SUB WORD PTR FSIZ,AX
  2217.  JNC NOCARRYZ
  2218.  DEC WORD PTR FSIZ[2]
  2219. NOCARRYZ:SHR CX,1
  2220.  SHR CX,1
  2221.  SHR CX,1
  2222.  SHR CX,1
  2223.  ADD READPARA,CX
  2224.  JMP OPENFREAD
  2225. NLOTSLEFT:SUB WORD PTR FSIZ,AX
  2226.  JNC NOCARRYW
  2227.  DEC WORD PTR FSIZ[2]
  2228. NOCARRYW:CMP WORD PTR FSIZ,0
  2229.  JNZ ERRREADF
  2230.  CMP WORD PTR FSIZ[2],0
  2231.  JNZ ERRREADF
  2232.  ADD AX,15
  2233.  SHR AX,1
  2234.  SHR AX,1
  2235.  SHR AX,1
  2236.  SHR AX,1
  2237.  ADD READPARA,AX
  2238. CLOSEF:POP SI CX
  2239.  MOV AH,3EH
  2240.  MOV BX,RHANDLE
  2241.  INT 21H
  2242.  JC ERRREADF2
  2243.  CMP ARCHIVE,1
  2244.  JNE NOARC2
  2245.  PUSH CX
  2246.  MOV AX,1+43H*256
  2247.  MOV CL,DS:[SI+1]
  2248.  AND CL,223
  2249.  XOR CH,CH
  2250.  MOV DX,OFFSET PROTECT
  2251.  INT 21H
  2252.  POP CX
  2253.  JNC NOARC2
  2254.  MOV AH,9
  2255.  MOV DX,OFFSET ARCERR
  2256.  INT 21H
  2257.  JMP BOMB
  2258. NOARC2:JMP SCNEXTFIL
  2259.  
  2260. WRITE:;WRITES FILES FROM THE BEGINNING TO END, ROPEN=1 FIRST FILE ALREADY OPEN
  2261.  PUSH CS
  2262.  POP DS
  2263.  MOV DX,OFFSET WRITEMSG
  2264.  MOV AH,9
  2265.  INT 21H
  2266.  MOV AX,BEGINPARA
  2267.  MOV WRITEPARA,AX
  2268.  MOV SI,NEXTPATH
  2269.  INC SI
  2270.  MOV CX,FILES
  2271. SCANFORFILW:LODSB
  2272.  DEC SI
  2273.  CMP AL,16
  2274.  JE DOWRITE
  2275. SCANFNEXTW:ADD SI,23
  2276.  LOOP SCANFORFILW
  2277.  
  2278.  ;FINISHED WRITING
  2279.  RET
  2280.  
  2281. DOWRITE:PUSH CX SI
  2282.  ADD SI,10
  2283.  PUSH CS
  2284.  POP DS
  2285.  MOV DI,OFFSET TYPEMSG
  2286.  MOV CX,8
  2287.  PUSH DI
  2288.  MOV AL,32
  2289.  REP STOSB
  2290.  MOV AL,"."
  2291.  STOSB
  2292.  MOV AL,32
  2293.  MOV CX,3
  2294.  REP STOSB
  2295.  POP DI
  2296. CHFNAM:LODSB
  2297.  CMP AL,"."
  2298.  JNE NOTDOTZ
  2299.  JMP DOEXTB
  2300. NOTDOTZ:OR AL,AL
  2301.  JZ ENDCHFNAM
  2302.  STOSB
  2303.  JMP CHFNAM
  2304. DOEXTB:MOV DI,OFFSET TYPEMSG+9
  2305. COPYEXT1:LODSB
  2306.  OR AL,AL
  2307.  JZ ENDCHFNAM
  2308.  STOSB
  2309.  JMP COPYEXT1
  2310. ENDCHFNAM:MOV DI,OFFSET TYPEMSG
  2311.  MOV SI,OFFSET RENFILE
  2312.  MOV CX,12
  2313. CPFN:LODSB
  2314.  INC DI
  2315.  CMP AL,"?"
  2316.  JE NXTCPFN
  2317.  DEC DI
  2318.  STOSB
  2319. NXTCPFN:LOOP CPFN
  2320.  MOV SI,OFFSET TYPEMSG
  2321.  MOV DI,OFFSET TYPEMSG+100
  2322.  MOV CX,12
  2323. CPFNB:LODSB
  2324.  CMP AL,32
  2325.  JE NOTST
  2326.  STOSB
  2327. NOTST:LOOP CPFNB
  2328.  CMP ES:[DI-1],BYTE PTR "."
  2329.  JNE NOTMINDI
  2330.  DEC DI
  2331. NOTMINDI:XOR AL,AL
  2332.  STOSB
  2333.  MOV SI,OFFSET TYPEMSG+100
  2334.  MOV DX,SI
  2335. PRNAMEW:LODSB
  2336.  OR AL,AL
  2337.  JNZ PRNAMEW
  2338.  CALL PRFILENAME
  2339.  MOV SI,CURDEST
  2340. GETENDD:LODSB
  2341.  OR AL,AL
  2342.  JNZ GETENDD
  2343.  STD
  2344. GETSLLW:LODSB
  2345.  CMP AL,"\"
  2346.  JNE GETSLLW
  2347.  CLD
  2348.  MOV CX,SI
  2349.  MOV SI,CURDEST
  2350.  SUB CX,SI
  2351.  INC CX
  2352.  INC CX
  2353.  MOV DI,OFFSET TYPEMSG
  2354.  REP MOVSB
  2355.  MOV SI,OFFSET TYPEMSG+100
  2356.  MOV CX,13
  2357.  REP MOVSB
  2358.  POP SI
  2359.  PUSH SI
  2360.  CMP ROPEN,1
  2361.  JNE NOTALROPEN
  2362.  JMP ALROPEN
  2363. NOTALROPEN:CMP OVERWRITE,1
  2364.  JNE OVEROFF
  2365.  JMP NOTEXISTYET
  2366.  ;CHECK IF FILE ALREADY EXISTS
  2367.  ;JUMP TO NOTEXISTYET IF OVERWRITE=ON
  2368. OVEROFF:MOV AX,3DH*256
  2369.  MOV DX,OFFSET TYPEMSG
  2370.  INT 21H
  2371.  JNC EXISTYET
  2372.  JMP NOTEXISTYET
  2373. EXISTYET:MOV BX,AX
  2374.  MOV AH,3EH
  2375.  INT 21H
  2376.  CMP APPEND,1
  2377.  JNE NOAPPB
  2378.  JMP DOAPP
  2379. NOAPPB:MOV DX,OFFSET OVERMSG
  2380.  MOV AH,9
  2381.  INT 21H
  2382. GETREP1:MOV AH,8
  2383.  INT 21H
  2384.  CMP AL,"a"
  2385.  JB GR1
  2386.  CMP AL,"z"
  2387.  JA GR1
  2388.  SUB AL,32
  2389. GR1:CMP AL,"E"
  2390.  JNE GR1AB
  2391.  JMP GR2
  2392. GR1AB:CMP AL,"S"
  2393.  JNE GRNS
  2394.  JMP GR2
  2395. GRNS:CMP AL,"A"
  2396.  JNE GRNSB
  2397.  JMP GR2
  2398. GRNSB:CMP AL,"O"
  2399.  JNE GETREP1
  2400. GR2:MOV DL,AL
  2401.  PUSH AX
  2402.  MOV AH,2
  2403.  INT 21H
  2404.  MOV DL,13
  2405.  INT 21H
  2406.  MOV DL,10
  2407.  INT 21H
  2408.  POP AX
  2409.  CMP AL,"A"
  2410.  JNE NOTAO
  2411.  MOV OVERWRITE,1
  2412.  JMP NOTEXISTYET
  2413. NOTAO:CMP AL,"O"
  2414.  JE NOTEXISTYET
  2415.  CMP AL,"E"
  2416.  JNE NOTAPPEND
  2417. DOAPP:MOV AX,3DH*256+146
  2418.  MOV DX,OFFSET TYPEMSG
  2419.  INT 21H
  2420.  JNC APPOK1
  2421.  JMP ERROPENW
  2422. APPOK1:MOV BX,AX
  2423.  MOV WHANDLE,AX
  2424.  XOR CX,CX
  2425.  XOR DX,DX
  2426.  MOV AX,42H*256+2
  2427.  INT 21H
  2428.  JNC APPOK2
  2429.  MOV AH,3EH
  2430.  INT 21H
  2431.  JMP ERROPENW
  2432. APPOK2:JMP APPOPEN
  2433. NOTAPPEND:POP SI
  2434.  PUSH SI
  2435.  MOV BYTE PTR DS:[SI],255
  2436.  MOV ROPEN,0
  2437.  ADD DS:[SI+6],WORD PTR 15
  2438.  JNC ADWRPARA
  2439.  INC WORD PTR DS:[SI+8]
  2440. ADWRPARA:SUB WORD PTR DS:[SI+8],1
  2441.  JC ADWRPARA2
  2442.  ADD WRITEPARA,4096
  2443.  JC NOTSLEFT1
  2444.  JMP ADWRPARA
  2445. ADWRPARA2:MOV AX,WORD PTR DS:[SI+6]
  2446.  MOV CL,4
  2447.  SHR AX,CL
  2448.  ADD WRITEPARA,AX
  2449.  MOV AX,WRITEPARA
  2450.  CMP AX,MEM
  2451.  JB STILLLEFT2W
  2452. NOTSLEFT1:POP SI CX
  2453.  RET
  2454. STILLLEFT2W:POP SI CX
  2455.  MOV AH,2
  2456.  MOV DL,13
  2457.  INT 21H
  2458.  MOV DL,10
  2459.  INT 21H
  2460.  JMP SCANFNEXTW
  2461.  
  2462.  
  2463. NOTEXISTYET:MOV AH,3CH
  2464.  MOV CL,DS:[SI+1]
  2465.  XOR CH,CH
  2466.  MOV DX,OFFSET TYPEMSG
  2467.  INT 21H
  2468.  JNC OPENOKW
  2469.  
  2470. ERROPENW:MOV AH,9
  2471.  MOV DX,OFFSET ERRWFIL
  2472.  INT 21H
  2473.  JMP BOMB
  2474. OPENOKW:MOV WHANDLE,AX
  2475. APPOPEN:MOV AX,DS:[SI+6]
  2476.  MOV WORD PTR WSIZ,AX
  2477.  MOV AX,DS:[SI+8]
  2478.  MOV WORD PTR WSIZ[2],AX
  2479. ALROPEN:
  2480.  
  2481. MAINWRITE:MOV AX,CS
  2482.  ADD AX,WRITEPARA
  2483.  MOV DS,AX
  2484.  MOV CX,CS
  2485.  ADD CX,MEM
  2486.  SUB CX,AX
  2487.  JNZ STILLMEMW
  2488.  
  2489.  ;WROTE EVERYTHING IN MEMORY
  2490.  POP SI CX
  2491.  MOV ROPEN,1
  2492.  RET
  2493.  
  2494. STILLMEMW:CMP CX,4095
  2495.  JNA NOT2MUCHW
  2496.  MOV CX,4095
  2497. NOT2MUCHW:SHL CX,1
  2498.  SHL CX,1
  2499.  SHL CX,1
  2500.  SHL CX,1
  2501.  PUSH DS CS
  2502.  POP DS
  2503.  CMP DS:[SI+8],WORD PTR 0
  2504.  JNE GOAHEAD
  2505.  CMP CX,DS:[SI+6]
  2506.  JNA GOAHEAD
  2507.  MOV CX,DS:[SI+6]
  2508. GOAHEAD:POP DS
  2509.  XOR DX,DX
  2510.  MOV BX,WHANDLE
  2511.  MOV AH,40H
  2512.  PUSH CX CS
  2513.  INT 21H
  2514.  POP DS CX
  2515.  JC WERR1
  2516.  CMP CX,AX
  2517.  JE WROK1
  2518. WERR1:MOV AH,3EH
  2519.  MOV BX,WHANDLE
  2520.  INT 21H
  2521. WERR2:JMP ERROPENW
  2522.  
  2523. WROK1:SUB DS:[SI+6],CX
  2524.  JNC NOCARRYD
  2525.  DEC WORD PTR DS:[SI+8]
  2526. NOCARRYD:ADD WORD PTR TOTBYTES,CX
  2527.  JNC TOTNOVER
  2528.  INC WORD PTR TOTBYTES[2]
  2529. TOTNOVER:ADD CX,15
  2530.  SHR CX,1
  2531.  SHR CX,1
  2532.  SHR CX,1
  2533.  SHR CX,1
  2534.  ADD WRITEPARA,CX
  2535.  CMP DS:[SI+6],WORD PTR 0
  2536.  JE MAINWRITEOK1
  2537.  JMP MAINWRITE
  2538. MAINWRITEOK1:CMP DS:[SI+8],WORD PTR 0
  2539.  JE MAINWRITEOK2
  2540.  JMP MAINWRITE
  2541. MAINWRITEOK2:MOV ROPEN,0
  2542.  PUSH CS
  2543.  POP DS
  2544.  MOV BX,WHANDLE
  2545.  MOV AX,87*256+1
  2546.  MOV CX,CS:[SI+2]
  2547.  MOV DX,CS:[SI+4]
  2548.  INT 21H
  2549.  JC WERR2
  2550.  MOV AH,3EH
  2551.  MOV BX,WHANDLE
  2552.  INT 21H
  2553.  JC WERR2
  2554.  POP SI CX
  2555.  MOV DS:[SI],BYTE PTR 255
  2556.  INC WORD PTR TOTFILES
  2557.  JNC TOTFNOVER
  2558.  INC WORD PTR TOTFILES[2]
  2559. TOTFNOVER:JMP SCANFNEXTW
  2560. ;PRFILENAME:ROUTINE TO PRINT FILENAME FROM DS:DX
  2561. PRFILENAME:PUSH CX SI DX
  2562.  MOV SI,DX
  2563.  MOV AH,3
  2564.  XOR BH,BH
  2565.  INT 10H
  2566.  CMP DL,11
  2567.  JB BEGLIN
  2568. PRFN2:INC DL
  2569.  LODSB
  2570.  OR AL,AL
  2571.  JNE PRFN2
  2572.  CMP DL,78
  2573.  JNA OKNOTNEWLIN
  2574.  MOV AH,2
  2575.  MOV DL,10
  2576.  INT 21H
  2577. BEGLIN:MOV AH,2
  2578.  MOV DL,13
  2579.  INT 21H
  2580.  MOV CX,11
  2581.  MOV DL,32
  2582. PRFN3LP:INT 21H
  2583.  LOOP PRFN3LP
  2584. OKNOTNEWLIN:MOV AH,3
  2585.  XOR BH,BH
  2586.  INT 10H
  2587.  CMP DL,12
  2588.  JB NOCOMMA
  2589.  MOV AH,2
  2590.  MOV DL,","
  2591.  INT 21H
  2592.  MOV DL," "
  2593.  INT 21H
  2594. NOCOMMA:POP DX
  2595.  MOV SI,DX
  2596.  MOV AH,2
  2597. PRFNLP1:LODSB
  2598.  OR AL,AL
  2599.  JZ PRFNLP2
  2600.  MOV DL,AL
  2601.  INT 21H
  2602.  JMP PRFNLP1
  2603. PRFNLP2:POP SI CX
  2604.  RET
  2605.  
  2606.  
  2607. PROGEND LABEL BYTE
  2608. CSEG ENDS
  2609.  END START
  2610.